12.5.10.1 sync.Once
sync.Onceを使用することで必要な時に一度だけ特定の処理を実行できる
code:go
package main
import (
"fmt"
"sync"
)
func main() {
// "初期化中!" は一度だけ表示される
result := Parse("hello")
fmt.Println(result) // h
result2 := Parse("goodbye")
fmt.Println(result2) // g
}
// 「遅くて複雑な」構文解析器
type SlowComplicatedParser interface {
Parse(string) string
}
// パッケージレベルの変数として定義することで、
// parser は初期化後の状態を保持し、
// once は初期化処理が一度だけ実行されたことを管理できる。
var parser SlowComplicatedParser
var once sync.Once
func Parse(dataToParse string) string {
once.Do(func() {
parser = initParser() // 一度だけ行われる
})
return parser.Parse(dataToParse) // parserを使って「解析」
}
func initParser() SlowComplicatedParser {
// 諸々のセットアップやロードをここで行う
fmt.Println("初期化中!")
return SCPI{}
}
type SCPI struct {
}
// 型SCPIのメソッドParse(構文解析を行う)
func (s SCPI) Parse(in string) string {
if len(in) > 1 { // ここでは単に最初の1文字を返す
}
return "" // 空文字列のときは空文字列を返す
}